package fr.upmc.alasca.centreCalcul.objets;

import java.io.Serializable;

/**
 * Représente une requête générée par une application.
 * 
 * @author Antoine Lavaire, Sabri Labassi, Thibaut Fleury, Ryme Fantazi
 */
public	class	Requete
implements		Serializable
{
	/* ------------------------------------------------------------- ATTRIBUT */
	private static final long serialVersionUID = 1L;

	protected	int		idRequete;
	protected	long	nbInstructions;
	protected	long	heureArrivee;
	protected	long	heureDebutTraitement;
	protected	long	heureFinTraitement;
	/**
	 * Chaque requête garde une référence de l'application parent via l'ID
	 * application. Cet identifiant sera utilisé par le capteur de calcul de
	 * temps pour communiquer avec le port du contrôleur d'application. Ce
	 * méchanisme doit nous permettre d'économiser la gestion
	 * d'abonnements/désabonnements des contrôleurs d'application auprès des
	 * differents coeurs sur lesquels les requêtes sont effectivement exécutées.
	 */
	protected	String	idApplication;




	/* --------------------------------------------------------- CONSTRUCTEUR */
	public	Requete
	(
		String	p_idApplication,
		int		p_idRequete,
		long	p_nbInstructions
	) {
		super();

		assert p_nbInstructions > 0;

		idApplication = p_idApplication;
		idRequete = p_idRequete;
		nbInstructions = p_nbInstructions;
		heureArrivee = 0;
		heureDebutTraitement = 0;
		heureFinTraitement = 0;
	}




	/* ------------------------------------------------------------ ACCESSEUR */
	public int getIdRequete() {
		return idRequete;
	}

	public long getNbInstructions() {
		return nbInstructions;
	}

	public long getHeureArrivee() {
		return heureArrivee;
	}
	
	public long getHeureDebutTraitement() {
		return heureDebutTraitement;
	}

	public void setHeureArrivee(long p_heureArrivee) {
		assert p_heureArrivee > 0;

		heureArrivee = p_heureArrivee;
	}

	public long getHeureFinTraitement() {
		return heureFinTraitement;
	}

	public void setHeureFinTraitement(long p_heureFinTraitement) {
		assert p_heureFinTraitement > 0;

		heureFinTraitement = p_heureFinTraitement;
	}

	public void setHeureDebutTraitement(long p_heureDebutTraitement) {
		heureDebutTraitement = p_heureDebutTraitement;
	}

	/* -------------------------------------------------------------- METHODE */
	public long getTempsTraitement() {
		assert heureFinTraitement > 0 && heureDebutTraitement > 0;

		return heureFinTraitement - heureDebutTraitement;
	}

	public long getTempsTotal() {
		assert heureFinTraitement > 0 && heureArrivee > 0;

		return heureFinTraitement - heureArrivee;
	}

	public String getIdApplication() {
		return idApplication;
	}

	public void setIdApplication(String idApplication) {
		this.idApplication = idApplication;
	}

	@Override
	public String toString() {
		return "Requete [idRequete=" + idRequete + ", nbInstructions="
				+ nbInstructions + ", heureArrivee=" + heureArrivee
				+ ", heureDebutTraitement=" + heureDebutTraitement
				+ ", heureFinTraitement=" + heureFinTraitement
				+ ", tempsTraitement (ms)=" + getTempsTraitement()
				+ ", idApplication=" + idApplication + "]";
	}
}
